///////////////////////////////
// Analizador léxico
///////////////////////////////


header {
	package practpl.cuatro;
}

class AnalexMiToken extends Lexer;

	options {
						
		k = 3;
		charVocabulary = '\3'..'\377';

	}

	tokens{
		
		//numeros
		LIT_REAL;
		LIT_ENTERO;
		
		// tipos
		INT = "int";
		CHAR = "char";
		
	}
	
	{	
		protected Token makeToken(int type) {
			// Crea un token tal y como lo haría CommonToken
			MiToken token = (MiToken)super.makeToken(type);
			// Añade la información del nuevo atributo
			token.setNuevoAtributo(this.getFilename());
			// Devuelve el token completo
			return token;
		}
	}

	protected NUEVA_LINEA: "\r\n" {newline();};
	BLANCO: (' '|'\t'|NUEVA_LINEA) {$setType(Token.SKIP);};
	
	protected DIGITO: '0'..'9';
	NUMERO : ((DIGITO)+ '.') => (DIGITO)+ '.' (DIGITO)* {$setType(LIT_REAL);} | (DIGITO)+ {$setType(LIT_ENTERO);};
	
	protected LETRA: ('A'..'Z')|('a'..'z');
	IDENT : (LETRA)((DIGITO)|(LETRA))*;
	
	OPERADOR: '+'|'-'|'/'|'*';
	PARENTESIS: '('|')';
	SEPARADOR: ';';
	ASIGNAR : ":=";
	COMENTARIO2: "//" (options {greedy = false;} :~('\r'))* NUEVA_LINEA {$setType(Token.SKIP);};
//	COMENTARIO3: ("/*" ( ('*' NUEVA_LINEA) => '*' NUEVA_LINEA | ('*' ~('/'|'\r'|'\n') ) => '*' ~('/'|'\r'|'\n') | NUEVA_LINEA | ~('\r'|'\n'|'*') )* "*/") { $setType(Token.SKIP);};
	COMENTARIOFinal: ("/*" ( ('*' NUEVA_LINEA) => '*' NUEVA_LINEA | ('*' ~('/'|'\r'|'\n') ) => ~('/'|'\r'|'\n') | NUEVA_LINEA | ~('\r'|'\n'|'*') )* "*/") { $setType(Token.SKIP);};
